package com.wslds.base.util;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;

import org.apache.commons.io.FilenameUtils;
import org.apache.log4j.Logger;
import org.im4java.core.CompositeCmd;
import org.im4java.core.ConvertCmd;
import org.im4java.core.IMOperation;

/**
 * Copyright (c) 2009-2010 李冬生(Domsn Lee)
 * Jul 6, 2009 6:31:25 PM  
 * Email: 8971092@qq.com
 * QQ: 8971092
 * All rights reserved
 * 转载请注明版权信息
 */
public class FileUtility
{
	public static Logger log = Logger.getLogger(FileUtility.class);
	
	/**
	 * 获取后缀名
	 * @param fileName 文件名
	 * @return 后缀名
	 */
	public static String getFileExtension(String fileName)
	{
		return FilenameUtils.getExtension(fileName);
	}
	
	
	/**
	 * 生成文件的随机名
	 * @param fileName	文件名
	 * @param length	随机生成的字符串长度(不包括前面系统时间)
	 * @return 随机名
	 */
	public static String generateRandomFileName(String fileName, int length)
	{
		return System.currentTimeMillis() //系统时间的毫秒数
				+ CharacterUtils.generateRandomName(length) //随机名 
				+ getFileExtension(fileName); //后缀
	}
	
	
	/**
	 * 转成成页面显示的文件大小格式
	 * @param size 文件长度
	 * @param precision 文件大小的精度
	 * @return 适当的文件大小格式
	 */
	public static String convertFileShowSize(long size, int precision)
	{
		log.debug("[File_Size]------------"+size+"B");
		
		if(size/1024/1024.0 > 1)
		{
			
			log.debug("[Size_MB_Level]");
			
			//precision+2为了取得小数点后面的精度
			String size_ = (size/1024.0/1024+"")
							.substring(0, precision+(size/1024.0/1024+"").indexOf(".")+1);
			
			log.debug("[AfterConvertSize]---------"+size_ + "MB");
			
			return size_ + "MB";
		}
		else if(size/1024.0 > 1)
		{
			log.debug("[Size_KB_Level]");
			
			String size_ = (size/1024.0+"").substring(0, precision+(size/1024.0+"").indexOf(".")+1);
			
			log.debug("[AfterConvertSize]---------"+size_ + "KB");
			
			return size_ + "KB";
		}
		else
		{
			log.debug("[Size_B_Level]");
			log.debug("[AfterConvertSize]---------"+size + "B");
			return size+"B";
		}
	}

	/**
	 * 图片的绝对路径
	 * @param baseCatalogDir
	 * @param catalogName
	 * @param fileName
	 * @return
	 */
	public static String getPhotoDir( String baseCatalogDir, String catalogName, String fileName ){
		return  baseCatalogDir + File.separator +
				BlogCons.CATALOG_TYPE.PHOTO + File.separator +
				catalogName + File.separator + fileName;
	}
	
	/**
	 * 图片的相对路径，相对于web
	 * @param baseCatalogDir
	 * @param catalogName
	 * @param fileName
	 * @return
	 */
	public static String getPhotoDir(  String catalogName, String fileName ){
		return  "upload" + File.separator +
			BlogCons.CATALOG_TYPE.PHOTO + File.separator +
				catalogName + File.separator + fileName;
	}
	
	public static String getWatermarkPath( String appBaseDir ){
		return appBaseDir + File.separator + 
				"skin" + File.separator + 
				"light_blue" + File.separator + 
				"images" + File.separator +
				"water.png";
	}
	
	public static String getTmpWatermarkPath( String appBaseDir ){
		return appBaseDir + File.separator + 
				"skin" + File.separator + 
				"light_blue" + File.separator + 
				"images" + File.separator +
				"water_tmp.png";
	}
	
	public static String getFixPrefixName( String fileName ){
		return "fix-" + fileName;
	}
	
	public static String getWaterPrefixName( String fileName ){
		return "water-" + fileName;
	}
	
	public static String getThinPrefixName( String fileName ){
		return "thin-" + fileName;
	}
	
	public static void genWaterMark( File destFile, String appBaseDir ) throws Exception{
		InputStream is = new FileInputStream(destFile);
		BufferedImage src = javax.imageio.ImageIO.read(is); //构造Image对象
		int srcWidth = src.getWidth(null); //得到源图宽
		is.close();
		
		/**
		 * 图片宽度大于 630 ，就压缩到630
		 * 源图不变，复制或压缩一份图片
		 * 以 "fix-" 为前缀
		 */
		if( srcWidth > 630 ){
			srcWidth = 630;
			IMOperation small = new IMOperation();
			small.resize(630);
			small.addImage(destFile.getCanonicalPath());
			small.addImage(destFile.getParent() + File.separator + FileUtility.getFixPrefixName(destFile.getName()));
			ConvertCmd cmd = new ConvertCmd();
			cmd.run(small);
		}else{
			IMOperation small = new IMOperation();
			small.addImage(destFile.getCanonicalPath());
			small.addImage(destFile.getParent() + File.separator + FileUtility.getFixPrefixName(destFile.getName()));
			ConvertCmd cmd = new ConvertCmd();
			cmd.run(small);
		}
		
		/**
		 * 计算 水印需要的宽度
		 * 如果 图片宽度 不足300， 水印就占有图片的 65%的宽度
		 * 否则就占有 35%的宽度
		 */
		double waterWidth = 0;
		if( srcWidth < 300 ){
			waterWidth = (0.65*((double)srcWidth)) ;
		}else{
			waterWidth = (0.35*((double)srcWidth)) ;
		}
		
		/**
		 * 根据上面计算出来的 水印宽度
		 * 需要临时生成一张这样宽度的水印图片，以待等下合成
		 */
		IMOperation resize = new IMOperation();
		resize.resize((int)waterWidth);
		resize.addImage(FileUtility.getWatermarkPath(appBaseDir));
		resize.addImage(FileUtility.getTmpWatermarkPath(appBaseDir));
		ConvertCmd cmd = new ConvertCmd();
		cmd.run(resize);
		
		/**
		 * 加水印,加一个，右下角
		 * 将刚刚临时生成的 水印图片 和 我们上传的图片进行合成
		 * 生成含有水印的图片，以"water-"为前缀
		 */
		IMOperation op = new IMOperation();
		op.gravity("SouthEast");
		op.dissolve(65);
		op.addImage( FileUtility.getTmpWatermarkPath(appBaseDir) );
		op.addImage( destFile.getParent() + File.separator + FileUtility.getFixPrefixName(destFile.getName()) );
		op.addImage( destFile.getParent() + File.separator + FileUtility.getWaterPrefixName(destFile.getName()) );
        CompositeCmd composite = new CompositeCmd();
        composite.run(op);
		
		// 加水印,加三个
		/*
		String[] location = new String[]{"NorthWest","Center","SouthEast"};
		for( int i = 0; i < 3; i++ ){
			IMOperation op = new IMOperation();
			op.gravity(location[i]);
			op.dissolve(55);
			op.addImage( FileUtility.getTmpWatermarkPath(appBaseDir) );
			if( i == 0 ){
				op.addImage( destFile.getParent() + File.separator + FileUtility.getFixPrefixName(destFile.getName()) );
			}else{
				op.addImage( destFile.getParent() + File.separator + FileUtility.getWaterPrefixName(destFile.getName()) );
			}
			op.addImage( destFile.getParent() + File.separator + FileUtility.getWaterPrefixName(destFile.getName()) );
	        CompositeCmd composite = new CompositeCmd();
	        composite.run(op);
		}
		*/
		
//		IMOperation op = new IMOperation();
//		op.addImage( destFile.getParent() + File.separator + FileUtility.getWaterPrefixName(destFile.getName()) );
//		op.shadow();
//		op.geometry().addRawArgs("100%x100%");
//		op.addImage( destFile.getParent() + File.separator + FileUtility.getWaterPrefixName(destFile.getName()) );
//		MontageCmd montageCmd = new MontageCmd();
//		montageCmd.run(op);
		
        /**
         * 生成缩略图，以便选择使用
         */
        IMOperation thin = new IMOperation();
        thin.resize((int)200);
        thin.addImage( destFile.getParent() + File.separator + FileUtility.getWaterPrefixName(destFile.getName()) );
        thin.addImage( destFile.getParent() + File.separator + FileUtility.getThinPrefixName(destFile.getName()) );
        ConvertCmd thinCmd = new ConvertCmd();
        thinCmd.run(thin);
	}
}
